package app;

import callBack.impl.FileSave2DB;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Window;
import task.FileScanner;
import task.FileSearch;
import util.DBInit;

import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;


public class Controller implements Initializable {

    @FXML
    private GridPane rootPane;

    @FXML
    private TextField searchField;

    @FXML
    private TableView<FileMeta> fileTable;

    @FXML
    private Label srcDirectory;


    private Thread scanThread;


    public void initialize(URL location, ResourceBundle resources) {
        //在界面初始化之前初始化数据库
        DBInit.init();
        // 添加搜索框监听器，内容改变时执行监听事件
        searchField.textProperty().addListener(new ChangeListener<String>() {

            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                freshTable();
            }
        });
    }

    /**
     * 点击选择文件，就会获取最终界面上选择的是哪个文件
     */
    public void choose() {
        // 选择文件目录
        DirectoryChooser directoryChooser = new DirectoryChooser();
        Window window = rootPane.getScene().getWindow();
        File file = directoryChooser.showDialog(window);
        if(file == null)
            return;
        // 获取选择的目录路径，并显示
        String path = file.getPath();
        //在界面中显示路径的内容
        this.srcDirectory.setText(path);
        //获取要扫描的文件夹路径之后，进行文件的扫描工作
        FileScanner fileScanner = new FileScanner(new FileSave2DB());
        if(scanThread != null) {
            //创建过任务，且该任务还没执行结束，中断当前正在扫描的任务
            scanThread.interrupt();
        }
        scanThread = new Thread(() -> {
            fileScanner.scan(file);
            //刷新界面，展示刚才扫描的文件信息
            freshTable();
        });
        scanThread.start();
    }

    // 刷新表格数据
    private void freshTable(){
        ObservableList<FileMeta> metas = fileTable.getItems();
        metas.clear();
        String dir = srcDirectory.getText();
        if(dir != null && dir.trim().length() != 0) {
            //取出数据库中已保存的内容展示到界面上
            //获取用户正在搜索框中输入的内容
            String content = searchField.getText();
            //根据选择的路径和用户的输入（为空就展示所有内容），将数据库中的指定内容刷新到界面中
            List<FileMeta> filesFromDB = FileSearch.search(dir,content);
            metas.addAll(filesFromDB);
        }
    }
}